package com.tt.job.service;

import com.tt.job.register.JobRegistryCenter;
import com.tt.job.register.LeaderChangeListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ClusterJobService implements LeaderChangeListener {
    private final static Logger logger = LoggerFactory.getLogger(ClusterJobService.class);
    @Autowired
    private JobEventConsumeService consumeService;
    //null 未设置
    private Boolean leader = null;
    @Autowired
    private JobEventProduceService produceService;

    /**
     * 启动分布式任务服务，完成本地job信息与服务端job信息同步
     * 通过leaderLatch选举机制对不同的服务提供不同的消息监听
     *
     * @param registryCenter
     */
    public void start(JobRegistryCenter registryCenter) {
        // 向注册中心新增本地新的job信息
        consumeService.init();

        // 启动消息生产者
        produceService.init();
        registryCenter.addJobListener(consumeService);
        registryCenter.addJobScheduleListener(produceService);

        // 添加 LeaderLatchListener
        registryCenter.addLeaderListener(this);

        //选举 leader
        logger.info("进行leader选举...");
        boolean leader = registryCenter.leading();

        //第一次有可能通知和查询均得到解决，主要解决在非leader的情况下，不会有通知，需要自动查询下
        if (this.leader == null) {
            if (leader) {
                notifyLeader();
            } else {
                notifyNotLeader();
            }
        }
    }

    @Override
    public void notifyLeader() {
        //获取到leader角色后，本地程序只进行任务发布处理，不再进行任务消费
        logger.debug("选举结果，本地进程为 Leader 开始进行事件发送处理，停止事件接收处理...");
        produceService.start();
        this.leader = true;
        consumeService.stop();
    }

    @Override
    public void notifyNotLeader() {
        this.leader = false;
        logger.debug("选举结果，本地进程为 非Leader 停止事件发送处理，改为事件接收处理...");
        consumeService.start();
        produceService.stop();
    }

    /**
     * TODO
     */
    public void stop() {

    }

}
